﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Day02
{
    /// <summary>
    /// 界面代码
    /// </summary>
    class Program
    {
        //继承
        static void Main1(string[] args)
        {
            //方法执行在栈中
            //声明父类型引用 指向 父类型对象
            //只能访问父类成员
            Person p1 = new Person();
            p1.Name = "张三";

            //声明子类型引用 指向 子类型对象
            //可以访问父类成员 与 子类成员
            Student s1 = new Student();
            s1.Score = 100;

            //声明父类型引用 指向 子类型对象
            //受类型制约 只能访问父类成员
            Person p3 = new Student();

            //转换[引用]的类型
            Student s3 = p3 as Student;//父子类之间可以用as转换
            s3.Score = 99;

            Teacher t3 = p3 as Teacher;//转换失败，结果为null，t3为空;p3中new Student()
            if (t3 != null)
            {
                t3.Sarlay = 10000;
            }
            //true类型兼容
            bool b1 = p3 is Student;
            bool b2 = p3 is Person;
            //false类型不兼容
            bool b3 = p3 is Teacher;
        }
        // 开放封闭原则 依赖倒置原则
        static void Main2(string[] args)
        {
            Person p1 = new Person();
            p1.GoHome("火车");//不符合开放封闭原则
            //原则：开  闭
            //对扩展开放 对修改关闭
            //需求变化：增加回家方式，坐飞机
            p1.GoHome(new Train());//面向对象开放封闭原则

            
        }
        /*
             * 练习：
             * 一个公司有如下几种岗位
             * 1普通员工：底薪
             * 2程序猿：底薪+项目分红
             * 3销售：底薪+月销售额*5%
             * 定义员工管理类，负责管理所有员工，提供计算总薪资的方法。
             * 需求变化：可能继续增加其他岗位
        */
        static void Main3(string[] args)
        {
            //对象初始化器：可以选择性的为对象赋值
            EmployeeManage manager = new EmployeeManage()
            {
                allEmployee  = new List<Employee>()
                {
                    new Employee(){ BasicSalary = 3000 },
                    new Programmer(){ BasicSalary = 8000, Bonus = 100000 },
                    new Salesman(){ BasicSalary = 3000,SaleAmount = 10000 },
                }
            };
            float result = manager.GetTotalSalary();
            Console.WriteLine("总工资：{0}", result);
        }
        //组合，现在叫关联，详见Day02PM
        /*
         * 需求变化:员工转岗  ---->   程序猿
         * 薪资计算方式
         */
        static void Main5(string[] args)
        {
            Employee emp = new Employee() { Name = "张三",JobName = "普通员工",BasicSalary = 3000};
            float s1 = emp.CalculateSalary();

            //emp.JobName = "程序员";//仅仅改变了头衔 实质的薪资没有变化
            //float s2 = emp.CalculateSalary();

            //开除普通员工“张三”，重新招聘程序员“张三”
            emp = new Programmer() { Name = "张三", JobName = "程序员", BasicSalary = 8000, Bonus = 10000 };
            float s3 = emp.CalculateSalary();
        }
    }
}
